#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMutex>
#include <QMainWindow>
#include <QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QtSerialPort/QSerialPort>
#include <QMessageBox>
#include <QFrame>
#include <QTimer>
#include <QElapsedTimer>
#include <QSettings>
#include <QRegularExpression>
#include <QThread>
#include <QReadWriteLock>
#include <QProcess>
#include <QRegularExpression>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT
    std::string hexStringToPlainText(const std::string& hexStr);


public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void refreshSerialPorts();

    void SetBaudRate();

    void on_RSSI_returnPressed();

    void on_comboBox_activated();

private:

    QReadWriteLock dataLock; // 读写锁
    QList<QByteArray> dataList;


    QString lastSelectedPort;  // 保存上一次选择的串口号
    QString selectedPort;  //选择的串口信息
    QString SaveRSSI; // 软件关闭后保存inputRSSI
    int SaveBaudRate=0; //软件关闭后保存波特率

signals:
    void returnToReadData(); // 回到ReadData函数 信号

private:
    Ui::MainWindow *ui;
    QSerialPort m_serial;


    QFrame* Lighting;  // 照明
    QFrame* ambient;  // 氛围灯
    QFrame* await;  // 待机
    QFrame* baby;  // 宝宝风
    QFrame* dimming;  // 调光
    QFrame* time;  // 定时
    QFrame* gear1;
    QFrame* gear2;
    QFrame* gear3;
    QFrame* gear4;
    QFrame* gear5;
    QFrame* gear6;
    QFrame* gearstop;
    QFrame* FTemp;
    QFrame* reminder;


    // QByteArray *dataToRelease; // 需要释放的内存资源
    QTimer *timer; //创建定时器
    int inputBaudRate=0; //波特率
    int SUCCESS=0; //统计按钮变绿的次数
    bool Within20s=true;
    int bufferSize = 25;
    bool temp = false;

    // 帧头和帧尾
    QByteArray frameHeader = "AA";
    QByteArray frameTail = "BB";
    QByteArray startdata = "AA20FFFFBB";
    // 定义重试空数据读取的最大次数
    const int MAX_EMPTY_DATA_RETRY = 3;
    int finalValue; //原码
    unsigned int complement=0; //补码
    int snumer=0;


    #define NUMBER 5
    #define GEAR_SIZE 87
    #define SECTOR_SIZE  50
    #define SUCCESSNUM 12
    int yes=1;
    int on=0;


    QByteArray data; //判断的到的数据
    QByteArray datatemp; //接收到的数据
    QString inputRSSI; //保存输入的inputRSSI值
    bool entertest=false; // 标志位，进入二次接收函数
    int comparisonCount = 1; // 静态变量用于记录比较通过的次数
    int AllcomparisonCount = 0; // 标记比较次数
    QByteArray lastData; // 静态变量用于存储上一次接收到的数据

    //挡位
    QByteArray zore="";
    QByteArray Onegear="01";
    QByteArray Twogear="02";
    QByteArray Threegear="03";
    QByteArray Fourgear="04";
    QByteArray Fivegear="05";
    QByteArray Sixgear="06";
    QByteArray Stopgear="07";
    QByteArray Lightinggear="08";
    QByteArray dimminggear="09";
    QByteArray Timegear="10";
    QByteArray Babygear="11";
    QByteArray Ambientgear="12";
    QByteArray Awaitgear="13";

    QByteArray secondByteArray; //第二位数据
    QByteArray thirdsecondByteArray; //第三位数据
    QByteArray foursecondByteArray; //第四位数据
    QByteArray fivesecondByteArray; //第wu位数据
    QByteArray secondByteComp; //第二位数据 用于标识ui界面
    int currentIndex=0;

    void AddLabelToFrame(QFrame* frame, const QString& labelText);
    void OpenSerialPorts(const QString &portName);
    void RightComp(QFrame* frame);
    void ErrorComp(QFrame* frame);
    void NumRightComp(QFrame* frame);
    void NumErrorComp(QFrame* frame);
    void DefaultPattern();
    void CorrectLighting();
    void readData();
    void ReceiveDataTest();
    void ProcessFrame(int yeson);
    void openSavedPort();
    void closeEvent(QCloseEvent *event);
    void availableports();
    void handleTimeout();
    void checkData();
    void OriginalCode();
    void EstimateData();
    bool CompareValues(QByteArray currentValue);
    void processNextData();
    void start_to_work();
    void saveCurrentState();
    void startNewInstance();
    void getstatic(const QByteArray &data);
    void SetGearColors();

    // void onNewInstanceFinished(int exitCode, QProcess::ExitStatus exitStatus);

};
#endif // MAINWINDOW_H
